//
// Created by liuyu on 2024/6/10.
//

#include <gpio.h>
#include <string.h>
#include <stm32f1xx_it.h>
#include <usart.h>
#include "stm32f1xx_hal.h"
#include "rs485.h"
#include "myPrintf.h"

extern TIM_HandleTypeDef htim4;
extern DMA_HandleTypeDef hdma_usart3_rx;
extern UART_HandleTypeDef huart3;


uint8_t recv[200]={0};

/**
 * 不精确延时
 * @param ms
 */
void delay_ms(uint32_t ms)
{
    uint32_t loops = ms*12000;
    while (loops){
        loops--;
    }
}

/**
 * 485发送函数
 * @param data ：要发送的数据指针
 * @param len ： 要发送的数据长度
 */
void send_485(uint8_t *data,uint32_t len)
{
    HAL_GPIO_WritePin(SELECT_485_GPIO_Port,SELECT_485_Pin,GPIO_PIN_SET);
    delay_ms(5);
    HAL_UART_Transmit(&huart3,data,len,500);
    HAL_GPIO_WritePin(SELECT_485_GPIO_Port,SELECT_485_Pin,GPIO_PIN_RESET);
}

/**
 * rs485初始化
 */
void rs485Init(void)
{
    HAL_GPIO_WritePin(SELECT_485_GPIO_Port,SELECT_485_Pin,GPIO_PIN_RESET);
    HAL_UARTEx_ReceiveToIdle_DMA(&huart3,recv,sizeof(recv));
    __HAL_DMA_DISABLE_IT(&hdma_usart3_rx,DMA_IT_HT);
}

/**
 * 485接收函数
 * @param Size ： 接收到数据的实际长度
 */
void rs485Recv(uint16_t Size)
{
    printf_uart1("recv = %s\r\n",recv);
    printf_uart1("Size = %d\r\n",Size);
    memset(recv,0,sizeof (recv));
    rs485Init();
}